package com.glqiang.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.Objects;

/**
 * @author glq1218
 */
public class JwtUtils {
    /**
     * token过期时间
     */
    public static final long EXPIRE = 1000 * 60 * 60 * 24;
    /**
     * 密钥
     */
    public static final String APP_SECRET = "this a secret";

    /**
     * 根据用户名生成jwt token
     *
     * @param username 用户名
     * @return JwtToken
     */
    public static String getToken(String username) {

        return Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                .setSubject("user_token")
                // 设置过期时间
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                // 设置token主体部分，存储用户信息
                .claim("username", username)
                .signWith(SignatureAlgorithm.HS256, APP_SECRET)
                .compact();
    }

    /**
     * 解析token
     *
     * @param token 令牌
     * @return 解析后的token主体
     */
    public static Claims parseToken(String token) {
        Claims claims = null;
        try {
            claims = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(token).getBody();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return claims;
    }

    /**
     * 根据token获取用户id
     *
     * @param token 令牌
     * @return 用户id
     */
    public static String getUsername(String token) {
        Claims claims = parseToken(token);
        if (Objects.isNull(claims)) {
            return null;
        }
        return (String) claims.get("username");
    }
}
